Voir le code pour croiser, préparer et nettoyer les données

Communes

# Charger les données depuis les fichiers CSV
df_siret <- read_csv2("data/siret.csv")
df_datagouv <- read_csv2("data/datagouv.csv")

# Fusionner les données sur l'identifiant 'siret'
result <- left_join(df_siret, df_datagouv, by = "siret")

# Corriger les codes postaux et codes insee
format_code <- function(code) {
  ifelse(!is.na(suppressWarnings(as.numeric(code))), sprintf("%05d", as.integer(code)), code)
}

result$`Code postal de l'établissement` <- sapply(result$`Code postal de l'établissement`, format_code)
result$`Code commune de l'établissement` <- sapply(result$`Code commune de l'établissement`, format_code)

# Filtrer les données pour garder seulement 'Commune et commune nouvelle'
filtered_result <- result %>%
  filter(`Nature juridique de l'unité légale` == "Commune et commune nouvelle")

# Séparer les communes non doublonées (une seule occurence de code insee)
communes_simples <- filtered_result %>%
  group_by(`Code commune de l'établissement`) %>%
  filter(n() == 1) %>%
  ungroup()

# Filtrer les communes en doublons en ne gardant que celles qui publient sur data.gouv.fr (metric.dataset >= 1)
communes_multiples_cleaned <- filtered_result %>%
  group_by(`Code commune de l'établissement`) %>%
  filter(n() > 1 & metric.datasets >= 1) %>%
  ungroup()

# Réintégration des communes non doublonées
result_final <- bind_rows(communes_simples, communes_multiples_cleaned)

# Sauvegarder le résultat dans un nouveau fichier CSV
write_csv(result_final, "data/enriched_siret.csv")

# Affichage du nombre de lignes après nettoyage
print(paste("Nombre de lignes après nettoyage :", nrow(result_final)))
## [1] "Nombre de lignes après nettoyage : 33012"
# Ajout des données population communale

donnees_communes <- read_csv2("data/donnees_communes.csv") %>%
  select(COM, PTOT)

communes <- left_join(result_final, donnees_communes, by = c("Code commune de l'établissement" = "COM"))

communes <- communes %>%
  rename(code_epci = `Code EPCI de l'établissement`)



# Sauvegarde du CSV
write_csv(communes, "data/communes.csv")
library(readr)
library(ggplot2)
library(dplyr)

# Charger le fichier de données
data <- read_csv("data/communes+siret+metrics+pop.csv")

# Nettoyage
data <- data %>%
  rename(
    unite_legale = `Dénomination de l'unité légale`,
    PTOT = PTOT,  
    metric.datasets = metric.datasets 
  )

# 50 communes les plus peuplées
top_50_communes <- data %>%
  arrange(desc(PTOT)) %>%  
  slice_head(n = 50)

# Visualisation

ggplot(top_50_communes, aes(x = reorder(unite_legale, PTOT), y = metric.datasets)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  theme_minimal() +
  labs(
    title = "Nombre de datasets des 50 communes les plus peuplées",
    x = "Commune",
    y = "datasets"
  ) +
  theme(
    axis.text.y = element_text(size = 4), 
    plot.title = element_text(hjust = 0.5)
  )

## EPCI

library(dplyr)

# Filtrer les données EPCI et supprimer les doublons
epci <- result %>%
  filter(`Nature juridique de l'unité légale` %in% c(
    "Communauté de communes",
    "Communauté d'agglomération",
    "Métropole",
    "Communauté urbaine"
  )) %>%
  rename(code_epci = `Code EPCI de l'établissement`) %>%
  distinct(code_epci, .keep_all = TRUE) %>% 
  mutate(code_epci = trimws(as.character(code_epci)))  

# Traitement et nettoyage

communes <- communes %>%
  mutate(code_epci = as.character(code_epci))

epci <- epci %>%
  mutate(code_epci = as.character(code_epci))

communes <- communes %>%
  mutate(code_epci = trimws(code_epci))

epci <- epci %>%
  mutate(code_epci = trimws(code_epci))

communes <- communes %>%
  filter(!is.na(code_epci))

# Joindre les tables EPCI et communes

communes_epci <- communes %>%
  left_join(
    epci %>% select(code_epci, metric.datasets, metric.datasets.epci = metric.datasets), 
    by = "code_epci"
  )

# Ajouter les informations EPCI

communes_epci <- communes_epci %>%
  mutate(
    epci_present = ifelse(!is.na(metric.datasets) & metric.datasets > 0, "oui", "non"),
    epci_datasets = ifelse(epci_present == "oui", metric.datasets, NA)
  ) %>%
  select(-metric.datasets)

write_csv(communes_epci, "data/communes_epci_brut.csv")

# Charger les données de géolocalisation
geoloc_data <- read_csv2("data/geoloc.csv", show_col_types = FALSE)

# Une fois que tu as vérifié, renomme la colonne "SIRET" si elle existe
geoloc_data <- geoloc_data %>%
  rename(siret = `SIRET du siège de l'unité légale`)

geoloc_data <- geoloc_data %>%
  distinct(siret, .keep_all = TRUE)  # Conserve uniquement la première occurrence pour chaque siret

# Joindre les données de géolocalisation avec communes_epci en utilisant le "siret" comme clé de jointure
communes_epci_geoloc <- communes_epci %>%
  left_join(geoloc_data %>% select(siret, `Géolocalisation de l'établissement`), by = "siret")


# Sauvegarder le CSV final avec la géolocalisation ajoutée
write_csv(communes_epci_geoloc, "data/communes_epci_geoloc.csv")

Communes par région

# Librairies
library(dplyr)
library(ggplot2)
library(ggrepel)
library(scales)
library(plotly)


# Chargement et traitement des données
data <- read.csv("data/00-communes.csv")

data_clean <- data %>%
  filter(!is.na(region))

region_summary <- data_clean %>%
  group_by(region) %>%
  summarise(
    total_communes = n(),
    communes_with_datasets = sum(!is.na(datsets_commune) & datsets_commune >= 1, na.rm = TRUE)
  ) %>%
  mutate(percentage_with_datasets = (communes_with_datasets / total_communes) * 100) %>%
  arrange(desc(percentage_with_datasets))


# Histogramme
ggplot(region_summary, aes(x = reorder(region, percentage_with_datasets), y = percentage_with_datasets)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Part des communes publiant au moins un jeu de données",
    x = "Région",
    y = "% des communes"
  ) +
  theme_minimal()

# Tableau
region_summary %>%
  arrange(desc(percentage_with_datasets)) %>%
  knitr::kable(col.names = c("Région", "Total Communes", "Communes avec jeux de données", "Pourcentage (%)"))
Région Total Communes Communes avec jeux de données Pourcentage (%)
La Réunion 19 3 15.7894737
Provence-Alpes-Côte d’Azur 886 53 5.9819413
Martinique 34 2 5.8823529
Guyane 19 1 5.2631579
Île-de-France 1186 59 4.9747049
Guadeloupe 27 1 3.7037037
Pays de la Loire 1060 35 3.3018868
Bretagne 1086 30 2.7624309
Auvergne-Rhône-Alpes 3789 55 1.4515703
Nouvelle-Aquitaine 4067 49 1.2048193
Centre-Val de Loire 1667 17 1.0197960
Hauts-de-France 3650 32 0.8767123
Corse 355 3 0.8450704
Normandie 2411 16 0.6636251
Bourgogne-Franche-Comté 3529 20 0.5667328
Occitanie 4301 21 0.4882585
Grand Est 4807 21 0.4368629
2 0 0.0000000
Mayotte 17 0 0.0000000
# Traitement des données pour obtenir le nombre total de jeux de données par région
region_summary_datasets <- data %>%
  filter(!is.na(region)) %>%
  group_by(region) %>%
  summarise(
    total_datasets = sum(datsets_commune, na.rm = TRUE)
  ) %>%
  arrange(desc(total_datasets))


# Créer l'histogramme basé sur le nombre total de jeux de données par région
ggplot(region_summary_datasets, aes(x = reorder(region, total_datasets), y = total_datasets)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Total des jeux de données par région",
    x = "Région",
    y = "Nombre total de jeux de données"
  ) +
  theme_minimal()

# Population ajoutée

region_summary_ptot <- data %>%
  filter(!is.na(region) & !is.na(ptot)) %>%
  group_by(region) %>%
  summarise(
    total_population = sum(ptot, na.rm = TRUE),
    population_with_datasets = sum(ptot[datsets_commune >= 1], na.rm = TRUE), 
    total_datasets = sum(datsets_commune, na.rm = TRUE)
  ) %>%
  mutate(population_coverage_ratio = population_with_datasets / total_population) 

p <- ggplot(region_summary_ptot, aes(x = total_population, y = total_datasets, text = region, color = population_coverage_ratio)) +
  geom_point(size = 3) + 
  geom_smooth(method = "lm", se = FALSE, color = "black") + 
  scale_color_gradient(low = "lightblue", high = "darkblue", name = "Population couverte (%)") + 
  labs(
    title = "Relation entre la population et le nombre total de jeux de données par région",
    x = "Population totale (en millions)",
    y = "Nombre total de jeux de données"
  ) +
  theme_minimal()

interactive_plot <- ggplotly(p, tooltip = c("text", "population_coverage_ratio"))

interactive_plot

Communes par département

# Librairies
library(dplyr)
library(ggplot2)
library(ggrepel)
library(scales)
library(plotly)


# Chargement et traitement des données
data <- read.csv("data/00-communes.csv")

data_clean <- data %>%
  filter(!is.na(departement))

departement_summary <- data_clean %>%
  group_by(departement) %>%
  summarise(
    total_communes = n(),
    communes_with_datasets = sum(!is.na(datsets_commune) & datsets_commune >= 1, na.rm = TRUE)
  ) %>%
  mutate(percentage_with_datasets = (communes_with_datasets / total_communes) * 100) %>%
  arrange(desc(percentage_with_datasets))

# Tableau
departement_summary %>%
  arrange(desc(percentage_with_datasets)) %>%
  knitr::kable(col.names = c("Département", "Total Communes", "Communes avec jeux de données", "Pourcentage (%)"))
Département Total Communes Communes avec jeux de données Pourcentage (%)
Hauts-de-Seine 35 15 42.8571429
3 1 33.3333333
Seine-Saint-Denis 35 6 17.1428571
La Réunion 19 3 15.7894737
Hautes-Alpes 145 21 14.4827586
Val-de-Marne 39 5 12.8205128
Maine-et-Loire 140 12 8.5714286
Var 134 10 7.4626866
Bouches-du-Rhône 110 7 6.3636364
Martinique 34 2 5.8823529
Vendée 205 12 5.8536585
Guyane 19 1 5.2631579
Alpes-Maritimes 157 8 5.0955414
Ille-et-Vilaine 294 14 4.7619048
Morbihan 225 9 4.0000000
Isère 478 19 3.9748954
Loire-Atlantique 179 7 3.9106145
Guadeloupe 27 1 3.7037037
Val-d’Oise 171 6 3.5087719
Rhône 247 8 3.2388664
Yvelines 247 8 3.2388664
Charente-Maritime 438 14 3.1963470
Nord 612 18 2.9411765
Essonne 180 5 2.7777778
Vaucluse 147 4 2.7210884
Seine-et-Marne 478 13 2.7196653
Corse-du-Sud 122 3 2.4590164
Vienne 252 6 2.3809524
Haute-Savoie 263 6 2.2813688
Ain 363 8 2.2038567
Indre 233 5 2.1459227
Savoie 250 5 2.0000000
Hérault 326 6 1.8404908
Finistère 247 4 1.6194332
Gironde 508 8 1.5748031
Alpes-de-Haute-Provence 193 3 1.5544041
Deux-Sèvres 219 3 1.3698630
Landes 315 4 1.2698413
Oise 650 8 1.2307692
Loir-et-Cher 251 3 1.1952191
Seine-Maritime 678 8 1.1799410
Indre-et-Loire 258 3 1.1627907
Aveyron 271 3 1.1070111
Haute-Vienne 186 2 1.0752688
Vosges 487 5 1.0266940
Loire 308 3 0.9740260
Lot-et-Garonne 308 3 0.9740260
Doubs 516 5 0.9689922
Côtes-d’Armor 320 3 0.9375000
Sarthe 324 3 0.9259259
Côte-d’Or 676 6 0.8875740
Manche 380 3 0.7894737
Pyrénées-Atlantiques 528 4 0.7575758
Haute-Marne 406 3 0.7389163
Cher 272 2 0.7352941
Meurthe-et-Moselle 559 4 0.7155635
Haute-Garonne 572 4 0.6993007
Nièvre 303 2 0.6600660
Dordogne 466 3 0.6437768
Loiret 314 2 0.6369427
Bas-Rhin 473 3 0.6342495
Ardèche 316 2 0.6329114
Haut-Rhin 321 2 0.6230530
Charente 331 2 0.6042296
Gard 336 2 0.5952381
Eure-et-Loir 339 2 0.5899705
Drôme 345 2 0.5797101
Eure 538 3 0.5576208
Saône-et-Loire 548 3 0.5474453
Mayenne 212 1 0.4716981
Aude 425 2 0.4705882
Gers 453 2 0.4415011
Calvados 464 2 0.4310345
Meuse 486 2 0.4115226
Aisne 779 3 0.3851091
Haute-Saône 529 2 0.3780718
Pas-de-Calais 856 3 0.3504673
Tarn 305 1 0.3278689
Allier 308 1 0.3246753
Ariège 317 1 0.3154574
Moselle 666 2 0.3003003
Yonne 406 1 0.2463054
Puy-de-Dôme 440 1 0.2272727
Jura 455 1 0.2197802
Ardennes 429 0 0.0000000
Aube 410 0 0.0000000
Cantal 236 0 0.0000000
Corrèze 267 0 0.0000000
Creuse 249 0 0.0000000
Haute-Corse 233 0 0.0000000
Haute-Loire 235 0 0.0000000
Hautes-Pyrénées 458 0 0.0000000
Lot 297 0 0.0000000
Lozère 133 0 0.0000000
Marne 570 0 0.0000000
Mayotte 17 0 0.0000000
Orne 351 0 0.0000000
Pyrénées-Orientales 216 0 0.0000000
Somme 753 0 0.0000000
Tarn-et-Garonne 192 0 0.0000000
Territoire de Belfort 96 0 0.0000000
# Nombre total de jeux de données par département
departement_summary_datasets <- data %>%
  filter(!is.na(departement)) %>%
  group_by(departement) %>%
  summarise(
    total_datasets = sum(datsets_commune, na.rm = TRUE)
  ) %>%
  arrange(desc(total_datasets))

# Traitement des données pour obtenir le nombre total de jeux de données par département et la population totale
departement_summary_ptot <- data %>%
  filter(!is.na(region) & !is.na(ptot) & !is.na(departement)) %>%
  group_by(region, departement) %>%
  summarise(
    total_population = sum(ptot, na.rm = TRUE),
    total_datasets = sum(datsets_commune, na.rm = TRUE)
  )

# Nuage de points
departement_summary_ptot <- data %>%
  filter(!is.na(region) & !is.na(ptot) & !is.na(departement)) %>%
  group_by(region, departement) %>%
  summarise(
    total_population = sum(ptot, na.rm = TRUE),
    population_with_datasets = sum(ptot[datsets_commune >= 1], na.rm = TRUE), 
    total_datasets = sum(datsets_commune, na.rm = TRUE)
  ) %>%
  mutate(population_coverage_ratio = population_with_datasets / total_population) 

p <- ggplot(departement_summary_ptot, aes(x = total_population, y = total_datasets, text = departement, color = population_coverage_ratio)) +
  geom_point(size = 2) +  
  geom_smooth(method = "lm", se = FALSE, color = "black") + 
  scale_color_gradient(low = "lightblue", high = "darkblue", name = "Population couverte") + 
  labs(
    title = "Population couverte et nombre de jeux de données par département",
    x = "Population (en millions)",
    y = "Nombre de jeux de données"
  ) +
  theme_minimal()

interactive_plot <- ggplotly(p, tooltip = c("text", "population_coverage_ratio"))

interactive_plot

EPCI

Voir le code>

# Libraries
library(dplyr)
library(readr)

# Charger les données
data <- read_csv("data/00-communes.csv")

# Création d'une table EPCI
epci_summary <- data %>%
  filter(!is.na(libelle_epci)) %>%
  group_by(libelle_epci) %>%
  summarise(
    nom_epci = first(libelle_epci),
    datasets_epci = max(datasets_epci, na.rm = TRUE),
    total_datasets_communes = sum(datsets_commune, na.rm = TRUE),
    communes_publiant = sum(datsets_commune >= 1, na.rm = TRUE),
    total_communes = n(),
    part_communes_publiant = 100 * (communes_publiant / total_communes),
    pop_couverte = 100 * (sum(ptot[datsets_commune >= 1], na.rm = TRUE) / sum(ptot, na.rm = TRUE)),
    pop_totale_epci = sum(ptot, na.rm = TRUE),
    pop_communes_publiant = sum(ptot[datsets_commune >= 1], na.rm = TRUE)
  )

write_csv(epci_summary, "data/epci_summary.csv")
# Libraries
library(dplyr)
library(plotly)

# Filtre sur les 100 EPCI les plus peuplés
epci_top_100 <- epci_summary %>%
  arrange(desc(pop_totale_epci)) %>%
  slice_head(n = 100)

max_size <- max(sqrt(epci_top_100$total_datasets_communes))
sizeref <- 2.0 * max_size / 30

# Nuage de points
plot <- plot_ly(
  epci_top_100,
  x = ~pop_totale_epci,
  y = ~pop_communes_publiant,
  size = ~total_datasets_communes,
  color = ~part_communes_publiant,
  colors = colorRamp(c("lightblue", "darkblue")),
  type = 'scatter',
  mode = 'markers',
  marker = list(
    sizemode = 'diameter',
    opacity = 0.7,
    sizeref = sizeref,
    sizemin = 2 
  ),
  text = ~paste(nom_epci, "<br>Pop totale EPCI:", pop_totale_epci, 
                "<br>Pop communes publiant:", pop_communes_publiant, 
                "<br>Part communes publiant:", round(part_communes_publiant, 2), "%")
) %>%
layout(
    title = "Relation entre la population totale et la population des communes publiant par EPCI",
    xaxis = list(
      title = "Population totale EPCI",
      type = "log",
      tickvals = c(100000, 1000000), 
      ticktext = c("100K", "1M") 
    ),
    yaxis = list(
      title = "Population des communes publiant",
      type = "log",
      tickvals = c(100000, 1000000),
      ticktext = c("100K", "1M")
    ),
    legend = list(x = 1, y = 0.5, bgcolor = 'rgba(255,255,255,0)', bordercolor = 'rgba(0,0,0,0)'),
    margin = list(l = 50, r = 50, b = 50, t = 50),
    hovermode = "closest"
)

plot